package uade.distribuidas.server.domain;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import uade.distribuidas.repo.dto.CondicionVentaDTO;
import uade.distribuidas.repo.dto.ListaPrecioDTO;
import uade.distribuidas.repo.dto.RodamientoDTO;
import uade.distribuidas.repo.type.EstadoType;
import uade.distribuidas.repo.type.ListaType;
/**
 * 
 */
@Entity
@Table(name="listas_precios")
public class ListaPrecio  {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name = "idLista")	
	private Integer id;
	
	@Column(name="numero")
	private String numero;
	
	@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	@JoinTable(name = "listas_rodamientos",joinColumns = { @JoinColumn(name = "idlista", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "idrodamiento",nullable = false, updatable = false) })
	private List<Rodamiento> rodamientos;
	
	@Column(name="termino")
	private String termino;
	
	@Enumerated(EnumType.STRING)	
	private ListaType tipo;
	
	@Column(name="vigencia")
	private Date vigencia;
	
	@Column(name="estado",columnDefinition = "varchar(20) default 'ACTIVO'")
	@Enumerated(EnumType.STRING) 
	private EstadoType estado;
	
	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "listas_condiciones",
	joinColumns = { 
			@JoinColumn(name = "idLista", nullable = false, updatable = false) 
			}, 
	inverseJoinColumns = { 
			@JoinColumn(name = "idCondicion",nullable = false, updatable = false) 
			}
	)
	private List<CondicionVenta> condicionesVenta;
	
	@ManyToOne
	@JoinColumn(name="idProveedor")
	private Proveedor proveedor;
	
	public EstadoType getEstado() {
		return estado;
	}
	public void setEstado(EstadoType estado) {
		this.estado = estado;
	}
	public ListaPrecio() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}

	public List<Rodamiento> getRodamientos() {
		return rodamientos;
	}
	public void setRodamientos(List<Rodamiento> rodamientos) {
		this.rodamientos = rodamientos;
	}
	public String getTermino() {
		return termino;
	}
	public void setTermino(String termino) {
		this.termino = termino;
	}

	public Date getVigencia() {
		return vigencia;
	}
	public void setVigencia(Date vigencia) {
		this.vigencia = vigencia;
	}
	public List<CondicionVenta> getCondicionesVenta() {
		return condicionesVenta;
	}
	public void setCondicionesVenta(List<CondicionVenta> condicionesVenta) {
		this.condicionesVenta = condicionesVenta;
	}
	public Proveedor getProveedor() {
		return proveedor;
	}
	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public ListaType getTipo() {
		return tipo;
	}
	public void setTipo(ListaType tipo) {
		this.tipo = tipo;
	}
	public void agregarRodamiento(Rodamiento r) {
		if (this.rodamientos==null) {
			this.rodamientos = new ArrayList<Rodamiento>();
		}
		this.rodamientos.add(r);
	}
	
	
    public ListaPrecioDTO getVista(){
    	ListaPrecioDTO dto = new ListaPrecioDTO();
    	List<CondicionVentaDTO> ventas=new ArrayList<CondicionVentaDTO>();
    	for(CondicionVenta c:this.condicionesVenta){
    		ventas.add(c.getVista());
    	}
    	dto.setCondicionesVenta(ventas);
    	dto.setEstado(estado);
    	dto.setId(id);
    	dto.setNumero(numero);
    	dto.setProveedor(proveedor.getVista());
    	List<RodamientoDTO> roda=new ArrayList<RodamientoDTO>();
    	for(Rodamiento c:this.rodamientos){
    		roda.add(c.getVista());
    	}
    	dto.setRodamientos(roda);
    	dto.setTermino(termino);
    	dto.setTipo(tipo);
    	dto.setVigencia(vigencia);
    	return dto;
    }


	

}
